// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package fmt

import "errors"

// Errorf根据格式说明符设置格式，并将字符串作为
// 满足错误的值。
// None
// 如果格式说明符包含带错误操作数的%w谓词，
// 返回的错误将实现返回操作数的展开方法。它是
// 包含多个%w谓词或为其提供操作数无效
// 这不会实现错误接口。%w动词不是
// %v的同义词。
func Errorf(format string, a ...interface{}) error {
	p := newPrinter()
	p.wrapErrs = true
	p.doPrintf(format, a)
	s := string(p.buf)
	var err error
	if p.wrappedErr == nil {
		err = errors.New(s)
	} else {
		err = &wrapError{s, p.wrappedErr}
	}
	p.free()
	return err
}

type wrapError struct {
	msg string
	err error
}

func (e *wrapError) Error() string {
	return e.msg
}

func (e *wrapError) Unwrap() error {
	return e.err
}
